package cn.com.lyb.flink.transfrom;

import cn.com.lyb.flink.bean.WaterSensor;
import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;

/**
 * flatMap操作又称为扁平映射，主要是将数据流中的整体（一般是集合类型）拆分成一个一个的个体使用。
 * 消费一个元素，可以产生0到多个元素。flatMap可以认为是“扁平化”（flatten）和“映射”（map）两步操作的结合，
 * 也就是先按照某种规则对数据进行打散拆分，再对拆分后的元素做转换处理。
 * 同map一样，flatMap也可以使用Lambda表达式或者FlatMapFunction接口实现类的方式来进行传参，
 * 返回值类型取决于所传参数的具体逻辑，可以与原数据流相同，也可以不同。
 *
 * 案例需求：如果输入的数据是sensor_1，只打印vc；如果输入的数据是sensor_2，既打印ts又打印vc。
 */
public class FlatMapDemo {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        DataStreamSource<WaterSensor> sensorDS = env.fromElements(
                new WaterSensor("s1", 1L, 1),
                new WaterSensor("s2", 2L, 3),
                new WaterSensor("s2", 2L, 2),
                new WaterSensor("s3", 3L, 3));
        // 一进多出(包括0出)
        // 对于s1的数据，1进1出
        // 对于s2的数据，1进 2 出
        // 对于s3的数据，1进0出《类似于过滤的效果)


        sensorDS.flatMap(new FlatMapFunction<WaterSensor, String>() {
            @Override
            public void flatMap(WaterSensor value, Collector<String> out) throws Exception {
                if("s1".equals(value.getId())){
                    out.collect(value.getVc().toString());
                }else if ("s2".equals(value.getId())){
                    out.collect(value.getVc().toString());
                    out.collect(value.getTs().toString());
                }
            }
        }).print();

        env.execute();
    }
}
